diff --git a/system/libraries/Model.php b/system/libraries/Model.php
index 1d3cbdf..c4cba56 100644
--- a/system/libraries/Model.php
+++ b/system/libraries/Model.php
@@ -1,83 +1,83 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
-/**
- * CodeIgniter
- *
- * An open source application development framework for PHP 4.3.2 or newer
- *
- * @package		CodeIgniter
- * @author		ExpressionEngine Dev Team
- * @copyright	Copyright (c) 2008, EllisLab, Inc.
- * @license		http://codeigniter.com/user_guide/license.html
- * @link		http://codeigniter.com
- * @since		Version 1.0
- * @filesource
- */
-
-// ------------------------------------------------------------------------
-
-/**
- * CodeIgniter Model Class
- *
- * @package		CodeIgniter
- * @subpackage	Libraries
- * @category	Libraries
- * @author		ExpressionEngine Dev Team
- * @link		http://codeigniter.com/user_guide/libraries/config.html
- */
-class Model {
-
-	var $_parent_name = '';
-
-	/**
-	 * Constructor
-	 *
-	 * @access public
-	 */
-	function Model()
-	{
-		// If the magic __get() or __set() methods are used in a Model references can't be used.
-		$this->_assign_libraries( (method_exists($this, '__get') OR method_exists($this, '__set')) ? FALSE : TRUE );
-		
-		// We don't want to assign the model object to itself when using the
-		// assign_libraries function below so we'll grab the name of the model parent
-		$this->_parent_name = ucfirst(get_class($this));
-		
-		log_message('debug', "Model Class Initialized");
-	}
-
-	/**
-	 * Assign Libraries
-	 *
-	 * Creates local references to all currently instantiated objects
-	 * so that any syntax that can be legally used in a controller
-	 * can be used within models.  
-	 *
-	 * @access private
-	 */	
-	function _assign_libraries($use_reference = TRUE)
-	{
-		$CI =& get_instance();				
-		foreach (array_keys(get_object_vars($CI)) as $key)
-		{
-			if ( ! isset($this->$key) AND $key != $this->_parent_name)
-			{			
-				// In some cases using references can cause
-				// problems so we'll conditionally use them
-				if ($use_reference == TRUE)
-				{
-					$this->$key = NULL; // Needed to prevent reference errors with some configurations
-					$this->$key =& $CI->$key;
-				}
-				else
-				{
-					$this->$key = $CI->$key;
-				}
-			}
-		}		
-	}
-
-}
-// END Model Class
-
-/* End of file Model.php */
+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Model Class
+ *
+ * @package		CodeIgniter
+ * @subpackage	Libraries
+ * @category	Libraries
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/libraries/config.html
+ */
+class Model {
+
+	var $_parent_name = '';
+
+	/**
+	 * Constructor
+	 *
+	 * @access public
+	 */
+	function Model()
+	{
+		// If the magic __get() or __set() methods are used in a Model references can't be used.
+		$this->_assign_libraries( (method_exists($this, '__get') OR method_exists($this, '__set')) ? FALSE : TRUE );
+		
+		// We don't want to assign the model object to itself when using the
+		// assign_libraries function below so we'll grab the name of the model parent
+		$this->_parent_name = ucfirst(get_class($this));
+		
+		log_message('debug', "Model Class Initialized");
+	}
+
+	/**
+	 * Assign Libraries
+	 *
+	 * Creates local references to all currently instantiated objects
+	 * so that any syntax that can be legally used in a controller
+	 * can be used within models.  
+	 *
+	 * @access private
+	 */	
+	function _assign_libraries($use_reference = TRUE)
+	{
+		$CI =& get_instance();				
+		foreach (array_keys(get_object_vars($CI)) as $key)
+		{
+			if ( ! isset($this->$key) AND $key != $this->_parent_name)
+			{			
+				// In some cases using references can cause
+				// problems so we'll conditionally use them
+				if ($use_reference == TRUE)
+				{
+					$this->$key = NULL; // Needed to prevent reference errors with some configurations
+					$this->$key =& $CI->$key;
+				}
+				else
+				{
+					$this->$key = $CI->$key;
+				}
+			}
+		}		
+	}
+
+}
+// END Model Class
+
+/* End of file Model.php */
 /* Location: ./system/libraries/Model.php */
\ No newline at end of file
